package com.kclmedu.forhelp.ui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.filechooser.FileFilter;
import javax.swing.table.TableModel;

import org.apache.log4j.Logger;

import com.kclmedu.forhelp.data.MyCheckBoxEditor;
import com.kclmedu.forhelp.data.MyCheckBoxRender;
import com.kclmedu.forhelp.data.MyTableData;
import com.kclmedu.forhelp.filter.ExcelFileFilter;
import com.kclmedu.forhelp.util.ExportExcelUtil;
import com.kclmedu.forhelp.util.ReadExcelFileUtil;


/****************
 * 主界面
 * @author yejf
 *
 */
public class MainFrame extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 664762251620959637L;
	
	private static final Logger LOGGER = Logger.getLogger(MainFrame.class);

	//操作组件
	private JButton importBtn; //导入按钮
	private JButton exportBtn; //导出按钮
	
	private JFileChooser jfc; //文件选对器
	private JLabel txtLabel; //用来显示导入的文件路径，以文本标签形式显示
	
	private JTable contentTable; //显示导入Excel内容的表格
	
	private Box btnAndTxtBox = Box.createVerticalBox(); //用来存放按钮和标签
	private Box tblBox = Box.createHorizontalBox(); //用来存放表格
	private Box footerBox = Box.createHorizontalBox(); //用来存放导出按钮
	
	//添加菜单栏
	private JMenuBar menuBar;
	
	//构造方法
	public MainFrame() {
		
		//初始化菜单栏
		menuBar = new JMenuBar();
		//添加菜单
		JMenu config = new JMenu("配置");
		JMenuItem option = new JMenuItem("选项");
		config.add(option);
		JMenu help = new JMenu(" 帮助  ");
		JMenuItem about = new JMenuItem("关于");
		help.add(about);
		Font font = new Font("微软雅黑", Font.BOLD, 16);
		config.setFont(font);
		option.setFont(font);
		help.setFont(font);
		about.setFont(font);
		//添加到菜单栏中
		menuBar.add(config);
		menuBar.add(help);
		
		menuBar.setBorder(BorderFactory.createLineBorder(Color.ORANGE));
		menuBar.setBackground(Color.gray);
		//把菜单栏添加到主体中
		this.setJMenuBar(menuBar);
		
		//为两个子菜单添加事件
		option.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
//				JOptionPane.showMessageDialog(null, "你选择了 选项 菜单");
				//1.创建一个新的面板
				ConfigPanel panel = new ConfigPanel();
				panel.setVisible(true);
				//2.在这个面板中添加如下组件
				//2.1 label 和 textFile 
				//2.2 FileChooser
				
				//3. 显示这个面板
				
			}
		});
		
		//关于 菜单项的功能
		about.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(null, "作者：叶加飞 \n有疑问请邮件至：51467976@qq.com");
			}
		});
		
		//添加组件
		importBtn = new JButton("选择目标文件");
		txtLabel = new JLabel("文件路径：");
		exportBtn = new JButton("导出");
		//创建表格渲染器和表格编辑器
		MyCheckBoxRender render = new MyCheckBoxRender();
		MyCheckBoxEditor editor = new MyCheckBoxEditor();
		//为此按钮添加事件，打开文件选择器
		importBtn.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				//打开文件选择器
				jfc = new JFileChooser(System.getProperty("user.home")); //默认在用户主目录下
				//设置选择模式
				jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
				//设置可选择的文件过滤器
				FileFilter filter = new ExcelFileFilter();
				jfc.addChoosableFileFilter(filter);
				//设置文件过滤器
				jfc.setFileFilter(filter);
				//显示选择框
				jfc.showDialog(new Label(), "请选择要上传的Excel文件");
				
				if(jfc.getSelectedFile() != null) {
					//修改Lable显示的文字
					txtLabel.setText("文件路径:"+jfc.getSelectedFile().getAbsolutePath());
					//TODO: 读取选择的文件内容，并初始化 JTable组件
					//调用ReadExcelFileUtil类的方法来读取文件中的内容
					List<List<String>> datas = ReadExcelFileUtil.readExcel(jfc.getSelectedFile().getAbsolutePath());
					//创建表模型
					TableModel model = new MyTableData(datas);
					//创建 JTable
					contentTable = new JTable(model);
					//设置表格渲染器
					contentTable.setDefaultRenderer(Object.class, render);
					//设置表格编辑器
					for(int i = 0;i<contentTable.getColumnCount();i++) {
						contentTable.getColumnModel().getColumn(i).setCellEditor(editor);
					}
					
					//
					contentTable.setPreferredScrollableViewportSize(new Dimension(1080, 720));
					// 将表格加入到滚动条组件中
					JScrollPane scrollPane = new JScrollPane(contentTable);
					//先移除
					tblBox.removeAll();
					//再把此组件添加到面板中
					tblBox.add(scrollPane);
				}
				
			}
		});
		//设置按钮的大小
		importBtn.setSize(100, 30);
		
		//为导出按钮添加事件
		exportBtn.addActionListener(new ActionListener() {
			
			//使用一个List<List<String>>来存放所有需要导出的数据
			List<List<String>> exportDataList = new ArrayList<>();
			
			@Override
			public void actionPerformed(ActionEvent e) {
				List<String> gap = new ArrayList<>();
				gap.add(null);
				gap.add(null);
				
				//
				int i = JOptionPane.showConfirmDialog(null, "你确定是导出这些数据吗?");
				if(i == JOptionPane.OK_OPTION) {
					//此处开始做导出操作...
					LOGGER.info("正在导出数据到Excel中...");
					//TODO...
					//1. 先确认哪些列被选中
					//表中的数据模型
					int rows = contentTable.getRowCount(); //获取行数
					TableModel tm = contentTable.getModel();
					LOGGER.debug("本次处理的行数共计："+rows);
					
					//获取所有的复选框
					Map<Integer, JCheckBox> boxes = editor.getAllBox();
					//遍历
					//用来存放在奇数行时创建的集合
					List<List<String>> midList = new ArrayList<>();
					int count = 0;
					//从行开始遍历
					for(int row = 1; row < rows; row++) {
						Iterator<Integer> iter = boxes.keySet().iterator();
						//重置count
						count = 0;
						while(iter.hasNext()) {
							Integer columnIndex = iter.next();
							JCheckBox checkBox = boxes.get(columnIndex);
							//决定是否要创建ArrayList
							List<String> tmpList = null;
							//2. 把被选中列的单元格数据给取出来
							if(checkBox.isSelected()) {
								//row从1开始，所以奇数行要创建新的List
								if(row % 2 != 0) {
									tmpList = new ArrayList<>();
									//添加到中间暂存的集合中
									midList.add(tmpList);
								} else { //偶数行不需要创建新的List,使用在上次奇数行创建的List即可
									//要从前面添加进去的中间集合中取出来
									tmpList = midList.get(count++);
								}
								//取值
								String cellContent = null; 
								if(tm.getValueAt(row, columnIndex) != null) {
									cellContent = tm.getValueAt(row, columnIndex).toString();
								}
								String title = checkBox.getText();
								//判断
								if(cellContent != null) {
									//打印出来
									LOGGER.debug(title+":"+cellContent);
									//添加到集合中
									tmpList.add(title+":"+cellContent);
								}
							}
							//把tmpList添加到外面的集合中
							if(row % 2 != 0) {
								exportDataList.add(tmpList);
							} 
						}
						//
						if(row % 2 == 0) {
							//清空 中间过渡的List
							midList.clear();
							//添加一个或两个间隔。
							exportDataList.add(gap);
							exportDataList.add(gap);
						}
						
						LOGGER.debug(">>> 数据提取完成，共计："+exportDataList.size()+" 行记录.");
					}
					
					//为了把content内容过长的地方处理一下，此处再次迭代一次完整的集合，并处理
					/*for(List<String> innerList : exportDataList) {
						//此处只有2列
						for(int column=0;column < innerList.size(); column++) {
							String content = innerList.get(column);
							//判断
							if(content != null && content.length() >= 20) {
								//这种就表示内容太长，为了兼顾标签打印机的纸张宽度达不到，所以，我们要折行
								//处理此行
								System.out.println(">>> "+content);
							}
						}
					}*/
					
					//3. 利用WriteExcelFileUtil类完成写入功能
					try {
						String fileName = ExportExcelUtil.export(exportDataList, jfc.getSelectedFile().getParent());
						LOGGER.info("数据导出成功...");
						LOGGER.info("--------=======------------ 分割线 ----------=======---------");
						//强出提示框
						JOptionPane.showMessageDialog(null, "导出成功\n目标文件所在目录："+jfc.getSelectedFile().getParent()
									+"\n文件名："+fileName);
					} catch (RuntimeException ee) {
						LOGGER.error("数据导出失败", ee);
						//弹出提示框
						JOptionPane.showMessageDialog(null, "导出失败\n异常信息："+ee.getMessage());
					}
					//4. 结束
					System.out.println(">>>> 导出结束...");
				}
			}
		});
		
		//添加组件
		this.add(btnAndTxtBox);
		//往BOX中添加组件
		btnAndTxtBox.add(Box.createRigidArea(new Dimension(10, 10)));
		btnAndTxtBox.add(importBtn);
		btnAndTxtBox.add(Box.createVerticalStrut(20));
		btnAndTxtBox.add(txtLabel);
		//添加
//		btnAndTxtBox.add(Box.createVerticalGlue());
		btnAndTxtBox.add(Box.createVerticalStrut(20));
		//添加一条水平线
		btnAndTxtBox.add(new JSeparator());
		
		btnAndTxtBox.add(tblBox);
		
		//添加导出按钮
		btnAndTxtBox.add(footerBox);
		footerBox.add(Box.createRigidArea(new Dimension(10, 10)));
		footerBox.add(exportBtn);
		
		//设置标题
		this.setTitle("内容挑选器");
		//设置位置和大小
		this.setBounds(300, 200, 1080, 720);
		//设置显示性
//		this.setVisible(true);
		//设置关闭
		this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		MainFrame mf = new MainFrame();
		mf.setVisible(true);
		
		//添加退出确认框
		mf.addWindowListener(new WindowAdapter() {

			@Override
			public void windowClosing(WindowEvent e) {
				int i= JOptionPane.showConfirmDialog(null, "确认退出吗？");
				if(i == JOptionPane.OK_OPTION) {
					System.exit(0);
				} 
			}
			
		});
	}
}
